#ifndef ___fat32_operacionBA_obtener_clusteres_adicionales

#define ___fat32_operacionBA_obtener_clusteres_adicionales 1

#include "f32_mto.c"

struct fat32opBA_datos_solicitud {
  unsigned long ultimoClusterActual;
  unsigned long cantidad;
};

unsigned char fat32op_obtener_clusteres_adicionales(FAT32_PARAMS_OPERACION);

unsigned char fat32op_obtener_clusteres_adicionales (FAT32_PARAMS_OPERACION) {
  struct fat32opBA_datos_solicitud * datos = datosEntrada;
  unsigned long * clusteresObtenidos = malloc(sizeof(unsigned long) * (datos -> cantidad));
  unsigned long posicion;
  for (posicion = 0; posicion < (datos -> cantidad); posicion --)
    clusteresObtenidos[posicion] = 0;
  unsigned long cantidadObtenidos = 0;
  for (posicion = 2; (cantidadObtenidos <= (datos -> cantidad)) && (posicion <= fat32_ultimo_cluster()); posicion ++)
    if (!fat32_elemento_FAT(posicion)) {
      clusteresObtenidos[cantidadObtenidos] = posicion;
      cantidadObtenidos ++;
    }
  if (cantidadObtenidos < (datos -> cantidad)) {
    free(clusteresObtenidos);
    return 2;
  }
  if (datos -> ultimoClusterActual) fat32_establecer_elemento_FAT(datos -> ultimoClusterActual, *clusteresObtenidos);
  for (posicion = 0; (posicion + 2) <= cantidadObtenidos; posicion ++)
    fat32_establecer_elemento_FAT(clusteresObtenidos[posicion], clusteresObtenidos[posicion + 1]);
  if (cantidadObtenidos) fat32_establecer_elemento_FAT(clusteresObtenidos[cantidadObtenidos - 1], 268435448);
  *datosSalida = clusteresObtenidos;
  return 1;
}

#endif